//
//  159. 至多包含两个不同字符的最长子串.swift
//  手撕代码
//
//  Created by xiaoZuDeMeng on 2024/2/4.
//

import Foundation

//给你一个字符串 s ，请你找出 至多 包含 两个不同字符 的最长子串，并返回该子串的长度。
//
//
//示例 1：
//
//输入：s = "eceba"
//输出：3
//解释：满足题目要求的子串是 "ece" ，长度为 3 。
//示例 2：
//
//输入：s = "ccaabbb"
//输出：5
//解释：满足题目要求的子串是 "aabbb" ，长度为 5 。
//
//
//提示：
//
//1 <= s.length <= 105
//s 由英文字母组成

func 至多包含两个不同字符的最长子串(_ s: String) -> Int {
    let chars = [Character](s)
    var left = 0
    var ans = 0
    var map: [Character: Int] = [:]
    for index in 0..<chars.count {
        let char = chars[index]
        let current = map[char] ?? 0
        map[char] = current + 1
        while map.count > 2 {
            let removeKey = chars[left]
            if let removeValue = map[removeKey] {
                if removeValue == 1 {
                    map.removeValue(forKey: removeKey)
                } else {
                    map[removeKey] = removeValue - 1
                }
            }
            left += 1
        }
        ans = max(ans, index - left + 1)
    }
    return ans 
}
